#ifndef Z80_H
#define Z80_H
#include "Commons.h"
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class Z80 {
    public:
                                Z80();
        virtual                 ~Z80();
        void                    Reset();
        Z80ReadMemory           m_Read;
        Z80WriteMemory          m_Write;
        u8                      Fetch();
        int                     Execute( u8 );
        int                     ExecuteExtended( u8 );
        void                    HaltedStatus( bool );
        void                    PushWord( u16 );
        
        // Getters
        bool                    GetIME()const { return m_IME; }
        bool                    GetHalted()const { return m_Halted; }
        u16                     GetPC()const { return m_PC.W; }
        
        // Setters
        void                    SetIME( bool Value ) { m_IME = Value; }
        void                    SetPC( u16 Value ) { m_PC.W = Value; }
        
    private:
        u16                     ReadWord();
        u16                     PopWord();
        PairRegister            m_AF;
        PairRegister            m_BC;
        PairRegister            m_DE;
        PairRegister            m_HL;
        PairRegister            m_SP;
        PairRegister            m_PC;
        int                     m_Cycles;
        int                     m_TotalCycles;
        bool                    m_IME;
        bool                    m_PendingDI;
        bool                    m_PendingEI;
        bool                    m_Halted;
        
    // Opcodes
        void                    Add( u8 );
        void                    AddWithCarry( u8 );
        void                    AND( u8 );
        void                    Call( u16 );
        void                    Compare_8Bit( u8, u8 );
        void                    DecimalAdjust();
        void                    Decrement_8Bit( u8 & );
        void                    Increment_8Bit( u8 & );
        void                    LDHL_SPn();
        void                    OR( u8 );
        void                    RotateLeft();
        void                    RotateLeftWithCarry();
        void                    RotateRight();
        void                    RotateRightWithCarry();
        void                    SubtractWithCarry( u8 );
        void                    BIT( u8, int );
        void                    XOR( u8 );
};
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#endif
